package com.AdvancedDemos.单元测试_反射_注解.反射;

import java.lang.reflect.Field;

public class _4_反射成员变量 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, IllegalAccessException {
        /**
         * Class提供了从类中获取成员变量的方法。
         * public Field[] getFields () --- 获取类的全部成员变量（只能获取public修饰的)
         * public Field[] getDeclaredFields () --- 获取类的全部成员变量（只要存在就能拿到)
         * public Field getField (string name) --- 获取类的某个成员变量（只能获取public修饰的)
         * public Field getDeclaredField (string name) --- 获取类的某个成员变量(只要存在就能拿到)
         */
        Class clazz = Class.forName("com.AdvancedDemos.单元测试_反射_注解.反射.Person");//获取字节码文件对象

        //获取成员变量
        Field name = clazz.getDeclaredField("name");

        /**
         * Field类   获取到成员变量的作用:依然是赋值、取值。
         * void set (object obj，object value) --- 赋值
         * object get (object obj) --- 取值
         * public void setAccessible(boolean flag) --- 设置为true，表示禁止检查访问控制（暴力反射)
         */

        /*field:字段/属性/域/成员变量*/

        //使用成员变量
        name.setAccessible(true);
        Person person = new Person();
        name.set(person, "ikun");
        System.out.println(person);//Person{name='ikun', age=0, sex='null'}

        Object o = name.get(person);
        System.out.println(o);//ikun
    }
}
